package test;

import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.omg.CORBA.PUBLIC_MEMBER;

//异常：Exception		可以处理		程序在运行/编译过程中可能出现的一些事情
	//错误：failed		无法处理
public class 异常处理 {
	//异常超类
	
	//分类：1. RuntimeException + 2. Exception
	//1. 运行时异常(非明文，非检车)
	//2. 非运行时异常(编译、明文)
	//再划分的时候，看是否间接继承某个类，判断是否为运行时异常
	//举例：
	//NullPointException
	//ParseException e;		//Ctrl+左键查看
	
	
	//异常处理
	// 	try/ catch /finally
	//	throws
	//	throw	跟异常处理有关，但是不是特别多
	//自定义异常类
	//对于编译异常，必须要进行异常处理
	//对于运行时的异常，可以进行异常处理，也可以不处理
	
	/**
	 * 	常见的异常
	 * NullPointerException
	 * NumberFormatException
	 * ArrayIndexOutOfBoundsException
	 * StringIndexOutBoundsEcception
	 * ClassCaseException
	 * ArithmeticException
	 * IllegalArgumentException
	 * */
	public static void main(String[] args) {
		try {									// |异常处理的范围(捕获异常的范围)|
			Integer.parseInt("aaa");
		} catch (NumberFormatException e) {		// 如果try中不出现编译错误，catch也可以没有，但一般没有这种写法|捕获到要处理的异常|<catch小括号范围放的是try括号中有可能会发生的异常>
			// TODO: handle exception
			e.printStackTrace();
		}catch (NullPointerException e) {		//可以存在多个catch
			// TODO: handle exception
			System.out.println("空指针异常！");
			e.printStackTrace();				//打印红色文字(在控制台中把异常信息打印出来)
		}
		catch (Exception e2) {					//防止漏网之鱼
			// TODO: handle exception
			e2.printStackTrace();
		}
		finally {								// 可有可无 |异常处理过程最后的代码|
			System.out.println("笨蛋");
		}
		//try  
			//try范围中的代码一旦发生异常，范围内之后的代码(发生异常的代码之后的代码)不再执行
		//catch 
			//catch可以没有，也可以有多个
			//如果try中存在便已异常，那么在catch中必须对该编译异常进行处理
			//catch后面的exception只要能接收到异常，大括号中的代码就会执行
			//书写顺序： 后一个不能是前一个的子类
			//可以在最后增加一个catch(Exception e){}以捕获所自定义异常未包含的异常
		//finally
			//不管有没有异常，都会执行
		//根据异常信息找到出错位置
			//根据以下规则找到自己写的代码
			//全包名、文件名、行号
		
		
	}
	public void test2(String a) throws NumberFormatException, ParseException {
		Integer.parseInt(a);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date d = sdf.parse(a);
		//throws使用方法：在方法定义的时候就定义好可能会抛出的异常
		//方法调用时，处理可能会抛出的异常
		//调用该方法的地方需要处理该异常，也可以继续抛出
	}
	public void test4() {
		//throw 	抛出异常，结束方法
		throw new NullPointerException();	//主动的抛出了一个异常的对象
		//NullPointerException e = new NullPointerException();
		//throw e;
		//可以结合try catch和throws一起使用
	}
}
//自定义异常类
class myexception extends Exception{
	
}

//练习题：
class test5{
	void mainto() {
		System.out.println(test1());
	}
	int test1() {
		try {
			return 1/0;
		} catch (Exception e) {
			// TODO: handle exception
			return 2;
		}finally {
			return 3;
		}
	}
}

//debug单步调试,breakpoint设置断点
//普通的执行方式，run as不会设置断点，按照正常循序执行
//调试方法：F6向下执行一步
//F5,进入到即将调用的方法中(也可能跳入jdk中规定的某些方法中)
//F7，step return，立刻跳到调用的方法的位置


